package com.walter.redis.tools.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 分布式锁
 *  添加了该注解的方法，则会使用分布式锁。
 *  分布式锁的Key = prefixKey + suffixKey
 *
 *  使用对象：所有spring管理的bean。
 *            方法内调用的不可用。
 * @author walter
 * @date 2025/01/11 14:35
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.CONSTRUCTOR })
public @interface RedisLock {
    /**
     *  锁过期时间，单位：秒
     */
    int lockTime() default 30;

    /**
     *  分布式锁的key前缀
     *  没有声明prefixKey时，默认使用类名+方法名+方法参数类型作为前缀；
     *  声明后，以该值为分布式锁的Redis key前缀（可用于不同方法间加锁）。
     * @return  锁的key潜在
     */
    String prefix() default "";

    /**
     * 分布式锁的key后缀。
     * 支持Spring EL表达式取值。suffixKey="#变量名  或 #变量名.属性名"
     *
     * @return  锁的key后缀
     */
    String suffix() default "";
}
